package com.leaf.u_jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 运行时常量池导致的内存溢出异常
 * 在JDK1.6及之前的版本中，由于常量池分配在永久代内，我们可以通过
 * -XX: PermSize和-XX: MaxPermSize限制方法区大小，从而间接限制其中常量池
 * 的容量
 * 
 * 需要在JDK1.6之前版本测试：运行时常量池溢出java.lang.OutOfMemoryError:PermGen space
 * 
 * VM Args: -XX: PermSize=10M -XX: MaxPermSize=10M
 *
 */
public class RuntimeConstantPoolOOM {

	public static void main(String[] args) {
		//使用List保存着常量池引用，避免Full GC回收常量池行为
		List<String> list = new ArrayList<>();
		//10MB的PermSize在integer范围内足够产生OOM
		int i = 0;
		while(true){
			list.add(String.valueOf(i++));
		}
	}
	
}
